package com.nbcio.im.core.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.nbcio.im.core.ImMessage;

import java.util.List;

/**
 * IM消息服务接口
 *
 * @author nbacheng
 */
public interface ImMessageService extends IService<ImMessage> {
    
    /**
     * 发送私聊消息
     *
     * @param fromUserId 发送者ID
     * @param toUserId 接收者ID
     * @param content 消息内容
     * @param messageType 消息类型
     * @return 消息ID
     */
    String sendPrivateMessage(Long fromUserId, Long toUserId, String content, String messageType);
    
    /**
     * 发送群组消息
     *
     * @param fromUserId 发送者ID
     * @param groupId 群组ID
     * @param content 消息内容
     * @param messageType 消息类型
     * @return 消息ID
     */
    String sendGroupMessage(Long fromUserId, String groupId, String content, String messageType);
    
    /**
     * 获取私聊消息历史
     *
     * @param userId1 用户1ID
     * @param userId2 用户2ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 消息列表
     */
    List<ImMessage> getPrivateMessageHistory(Long userId1, Long userId2, Integer pageNum, Integer pageSize);
    
    /**
     * 获取用户的私聊会话列表（每个会话的最新一条消息）
     *
     * @param userId 用户ID
     * @return 消息列表
     */
    List<ImMessage> getPrivateConversations(Long userId);
    
    /**
     * 获取未读消息数量
     *
     * @param userId 用户ID
     * @param toUserId 私聊对方用户ID（私聊时使用）
     * @param groupId 群聊ID（群聊时使用）
     * @return 未读消息数量
     */
    int getUnreadCount(Long userId, Long toUserId, String groupId);
    
    /**
     * 标记消息为已读
     *
     * @param userId 用户ID
     * @param toUserId 私聊对方用户ID（私聊时使用）
     * @param groupId 群聊ID（群聊时使用）
     * @return 更新的消息数量
     */
    int markAsRead(Long userId, Long toUserId, String groupId);
    
    /**
     * 获取群组消息历史
     *
     * @param groupId 群组ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 消息列表
     */
    List<ImMessage> getGroupMessageHistory(String groupId, Integer pageNum, Integer pageSize);
    
    /**
     * 标记消息为已读
     *
     * @param messageId 消息ID
     * @param userId 用户ID
     */
    void markAsRead(String messageId, Long userId);
    
    /**
     * 撤回消息
     *
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean revokeMessage(String messageId, Long userId);
    
    /**
     * 获取未读消息数量
     *
     * @param userId 用户ID
     * @return 未读数量
     */
    Integer getUnreadCount(Long userId);
    
    /**
     * 获取与指定用户的未读消息数量
     *
     * @param userId 用户ID
     * @param targetUserId 目标用户ID
     * @return 未读数量
     */
    Integer getUnreadCount(Long userId, Long targetUserId);
    
    /**
     * 获取群组未读消息数量
     *
     * @param userId 用户ID
     * @param groupId 群组ID
     * @return 未读数量
     */
    Integer getGroupUnreadCount(Long userId, String groupId);
}
